AWS WAF Bot Controlルールグループを利用してBot対策を試みてみた

AWS WAF Bot Controlルールグループを利用してBot対策を試みてみた

AWS WAFとBot Controlルールグループを活用して、Facebookクローラーによる過剰なアクセスを特定、ブロック措置を取ることで、DB(RDS)の負荷軽減が実現できました。
Clock Icon2024.08.29

ボットによるアクセスが原因と推測されるRDSのDB負荷上昇が確認された環境で、
AWS WAF と AWS WAF Bot Control ルールグループ(AWSManagedRulesBotControlRuleSet)を利用して調査と対策を試みる機会がありました。

その内容について紹介させていただきます。

背景

  • RDS、DB のCPU使用率が100%に到達。サービスの遅延やエラー応答が確認されました。
  • 暫定対策として RDSのスペックアップを実施、サービス影響を回避していました。

対象システムの状況

RDS パフォーマンスインサイト情報

DB-AAS2

  • 増強によりサービスの遅延は解消しましたが、DB負荷は高い状態が継続していました。
  • スペックアップを継続した場合、費用負担も課題でした

AWS WAF による対策

Bot Controlルールグループ追加

既存の WAF ACL に 、AWS WAF Bot Control ルールグループ (AWSManagedRulesBotControlRuleSet)を追加しました。

https://dev.classmethod.jp/articles/aws-bot-control/

Bot Control ルール は「Common」を選択

BotControlルール設定1

初期段階では、Override rule group action を利用して、すべての「Count」として扱う設定としました。

BotControlルール設定2jpg

結果の確認

DB負荷の変動を観察しながら、DB負荷が収束、再上昇が記録されたタイミングで、AWS WAFのレポートを確認しました。

DB-AAS1

Traffic overview

Action_Totals

Bot detection

全アクセスの約2.6%がボットと判定されました。

Bot Detection

「Non-bots」をグラフの表示対象から除外、「Verified」「Unverified」の判別、特異な傾向は認められませんでした。

Bot Detection !nonbot

Bot category

Bot categories1

「HttpLibrary」を除外して、カテゴリ別のグラフを確認しました。

Bot categories2

「SocialMedia」が、DB負荷(AAS)と相関関係にある可能性が判明しました。

Bot categories3

DB-AAS1

Browse bot activity

詳細な分析により、Facebookからのリクエストが特定されました。

Bot activity facebook

ブロック実施

Category単位

今回は副作用、Facebook 以外の SNSへの影響を避けるため、「CategorySocialMedia」単位のブロックは見送りましたが、「CategorySocialMedia」と判定されたリクエスト、一律ブロックは以下で実現出来ます。

  • Override rule group action の解除
  • Override all rule actions を 「Override to Count」に設定

Override to count1

  • 「CategorySocialMedia」のみ 「Override to Block」に設定

Override Block SNS

Label

AWSManagedRulesBotControlRuleSetが付与したラベルを利用する事で、Facebookと判定されたボットのみのブロックが実現可能です。

BotContolRuleset Labels

WAF、レギュラールール

Labelでブロックルール作成

  • Inspect: 「Has a label」
  • Match key: 「awswaf:managed:aws:bot-control:bot:name:facebook」「awswaf:managed:aws:bot-control:bot:name:facebook_bot」

こちらも副作用、負荷問題が発生していないページのシェアなどに影響する可能性があったため、
一律のラベル制限も避けました。

UserAgent、リクエストパス

CloudFrontの標準アクセスログをAthena確認を試み、具体的なUserAgent、リクエスト先のパスの確認を試みました。

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/cloudfront-logs.html

SELECT sum(time_taken) as sum_time_taken,
	count(1) as count_req,
	substr(cs_uri_stem, 1, 4) as url_path_4,
	cs_user_agent
FROM "cloudfront_standard_logs"
WHERE cs_user_agent not like 'Mozilla%'
group by cs_user_agent,
	substr(cs_uri_stem, 1, 4)
order by sum(time_taken) desc

一般的なブラウザ「Mozilla」を名乗るリクエストは除外、

  • UserAgent文字列
  • リクエストパス(開始数文字)

単位でレスポンス時間(time_taken)の合計値と、リクエスト数を求めました。

Athena_UserAgent集計

特定のパス、Facebook の クローラー(
facebookexternalhit/1.1%20(+http://www.facebook.com/externalhit_uatext.php))に一致するリクエストをブロックするルールを作成しました。

ブロックルール作成

  • CloudFormation定義抜粋
        - Name: !Sub '${AWS::StackName}-BlockFacebookCrawler'
          Priority: 200
          Action:
            Block: {}
          Statement:
            AndStatement:
              Statements:
                - ByteMatchStatement:
                    SearchString: '/xyz/*'
                    FieldToMatch:
                      UriPath: {}
                    TextTransformations:
                      - Priority: 0
                        Type: NONE
                    PositionalConstraint: STARTS_WITH
                - ByteMatchStatement:
                    SearchString: 'facebookexternalhit'
                    FieldToMatch:
                      SingleHeader:
                        Name: 'user-agent'
                    TextTransformations:
                      - Priority: 0
                        Type: NONE
                    PositionalConstraint: STARTS_WITH

結果

AWS WAFによるブロック開始後、RDSのDB負荷が大幅に軽減されました。

ActionTotal Block実績

DB負荷改善後AAS

まとめ

AWS WAF Bot Control ルールを利用した Bot対策により、RDSの負荷軽減に成功した一例を紹介させて頂きました。

ただし、今回ブロックしたFacebookのクローラーは本来は善良な目的のボットでした。

FacebookExternalHit
FacebookExternalHitの主な目的は、Facebook、Instagram、MessengerなどのMetaファミリーのいずれかのアプリで共有されたアプリやウェブサイトのコンテンツをクロールすることです。リンクはコピー&ペースト、またはFacebookソーシャルプラグインを使用して共有されている可能性があります。このクローラーは、アプリまたはウェブサイトに関する情報(タイトル、説明、サムネイル画像など)を収集し、キャッシュに保存し、表示します。

https://developers.facebook.com/docs/sharing/webmasters/web-crawlers/

FacebookExternalHitクローラーは、マルウェアや悪意のあるコンテンツのチェックなど、セキュリティまたは整合性のチェックを実行

長期的には、以下の恒久対策を検討しています:

  • リクエスト先のページの最適化 (DB、CDN、アプリケーションの見直し、ボトルネック改善)
  • robots.txtの見直し (クロール不要なページの除外)

AWS WAFによるブロック、これらの恒久対策が実施されるまでの暫定措置として期間限定での利用予定です。

AWS WAFは、想定外のリクエストに対する迅速な緩和措置として非常に有効です。特にボット対策の必要性が高い場合、AWS WAF Bot Controlルールも併せてお試しください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.